home *** CD-ROM | disk | FTP | other *** search
- /*
- File: Translt.cpp
-
- Contains: Implementation of ODTranslation class.
-
- Owned by: Vincent Lo
-
- Copyright: © 1994 - 1996 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <2> 5/24/96 jpa 1246074: SOM_CATCH --> SOM_TRY..SOM_ENDTRY
-
- To Do:
- In Progress:
-
- */
-
- #define ODTranslation_Class_Source
- #define VARIABLE_MACROS
- #include <Translt.xih>
-
- #ifndef SOM_Module_OpenDoc_StdDefs_defined
- #include <StdDefs.xh>
- #endif
-
- #ifndef SOM_ODTypeList_xh
- #include <TypeList.xh>
- #endif
-
- #ifndef SOM_ODTypeListIterator_xh
- #include <TypLsItr.xh>
- #endif
-
- #ifndef SOM_ODStorageSystem_xh
- #include <ODStor.xh>
- #endif
-
- #ifndef SOM_ODStorageUnitView_xh
- #include <SUView.xh>
- #endif
-
- #ifndef SOM_Module_OpenDoc_StdTypes_defined
- #include <StdTypes.xh>
- #endif
-
- #ifndef _ODMEMORY_
- #include "ODMemory.h"
- #endif
-
- #ifndef _ISOSTR_
- #include "ISOStr.h"
- #endif
-
- #ifndef _EXCEPT_
- #include "Except.h"
- #endif
-
- #ifndef _ODMEMORY_
- #include "ODMemory.h"
- #endif
-
- #ifndef _STORDEF_
- #include "StorDef.h"
- #endif
-
- #ifndef _BARRAY_
- #include <BArray.h>
- #endif
-
- #ifndef __TRANSLATION__
- #include <Translation.h>
- #endif
-
- #ifndef __GESTALTEQU__
- #include <GestaltEqu.h> // For Gestalt
- #endif
-
- #ifndef __TOOLUTILS__
- #include <ToolUtils.h> // For BitTst
- #endif
-
- #ifndef __EDITIONS__
- #include <Editions.h> // For FormatType
- #endif
-
- #ifndef __ERRORS__
- #include <Errors.h>
- #endif
-
- #ifndef __MIXEDMODE__
- #include <MixedMode.h>
- #endif
-
- #ifndef _TRANSDLG_
- #include <TransDlg.h>
- #endif
-
- #ifndef _STORUTIL_
- #include <StorUtil.h>
- #endif
-
- #ifndef _TEMPOBJ_
- #include <TempObj.h>
- #endif
-
- #pragma segment ODTranslation
-
- #include "TransltB.cpp" // Platform-independent methods, if any
-
- #if ODDebug
- // #define ODDebug_Translation 1
- #endif
-
- //==============================================================================
- // Scalar Types
- //==============================================================================
-
- typedef struct {
- ODOSType destType;
- } TranslationHints;
-
- typedef struct {
- FormatType theType;
- long theLength;
- } FormatAvailable;
-
- //==============================================================================
- // Local Classes
- //==============================================================================
-
- class TranslationRefCon {
-
- public:
-
- TranslationRefCon() {fTypeList = kODNULL;
- fDataPtr = kODNULL;
- fDataType = kODNULL;
- fDataSize = 0;}
- ~TranslationRefCon() {}
-
- void InitTranslationRefCon(ODTypeList* typeList) {fTypeList = typeList;}
- void InitTranslationRefCon(ODTypeList* typeList,
- ODPtr dataPtr,
- ODPlatformType dataType,
- ODULong dataSize) {fTypeList = typeList;
- fDataPtr = dataPtr;
- fDataType = dataType;
- fDataSize = dataSize;}
-
- ODTypeList* fTypeList;
- ODPtr fDataPtr;
- ODPlatformType fDataType;
- ODULong fDataSize;
- };
-
- //==============================================================================
- // Function Prototype
- //==============================================================================
-
- static OSErr CommonTranslate(ODTranslation* translation,
- Environment* ev,
- ODValueType fromType,
- ODByteArray* fromData,
- ODValueType toType,
- ODHandle* destHandle);
-
- static pascal OSErr GetScrapDataProc(ScrapType requestedFormat,
- Handle dataH,
- void* srcDataGetterRefCon);
-
- static ODType LocalGetISOTypeFromPlatformType(ODPlatformType platformType,
- ODPlatformTypeSpace typeSpace);
-
- static ODPlatformType LocalGetPlatformTypeFromISOType(ODType isoType);
-
- //==============================================================================
- // Globals
- //==============================================================================
-
- static RoutineDescriptor gGetScrapDataProcRD = BUILD_ROUTINE_DESCRIPTOR(uppGetScrapDataProcInfo, GetScrapDataProc);
-
-
- //==============================================================================
- // Class ODTranslation
- //==============================================================================
-
- //------------------------------------------------------------------------------
- // ODTranslation: Purge
- //------------------------------------------------------------------------------
-
- SOM_Scope ODSize SOMLINK ODTranslationPurge(ODTranslation *somSelf, Environment *ev,
- ODSize size)
- {
- ODTranslationData *somThis = ODTranslationGetData(somSelf);
- ODTranslationMethodDebug("ODTranslation","ODTranslationPurge");
-
- return 0;
- }
-
- //------------------------------------------------------------------------------
- // ODTranslation: somUninit
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODTranslationsomUninit(ODTranslation *somSelf)
- {
- ODTranslationData *somThis = ODTranslationGetData(somSelf);
- ODTranslationMethodDebug("ODTranslation","ODTranslationsomUninit");
-
- ODDeleteObject(_fTranslationDialog);
- parent_somUninit(somSelf);
- }
-
- //------------------------------------------------------------------------------
- // ODTranslation: InitTranslation
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODTranslationInitTranslation(ODTranslation *somSelf, Environment *ev,
- ODSession* session)
- {
- ODTranslationData *somThis = ODTranslationGetData(somSelf);
- ODTranslationMethodDebug("ODTranslation","ODTranslationInitTranslation");
-
- SOM_TRY
-
- /* Moved from somInit. SOM itself sets fields to zero
- _fMEOExists = kODFalse;
- _fTranslationDialog = kODNULL;
- */
- somSelf->InitObject(ev);
-
- _fSession = session;
-
- ODSLong result;
-
- _fMEOExists = (Gestalt(gestaltTranslationAttr, &result) == noErr)
- && (BitTst(&result, 31 - gestaltTranslationMgrExists))
- && (&TranslateScrap != (void*)kUnresolvedCFragSymbolAddress);
-
- _fTranslationDialog = new TranslationDialog();
- if (_fTranslationDialog)
- _fTranslationDialog->InitTranslationDialog(session);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODTranslation: CanTranslate
- //------------------------------------------------------------------------------
-
- SOM_Scope ODTranslateResult SOMLINK ODTranslationCanTranslate(ODTranslation *somSelf, Environment *ev,
- ODValueType fromType)
- {
- ODTranslationData *somThis = ODTranslationGetData(somSelf);
- ODTranslationMethodDebug("ODTranslation","ODTranslationCanTranslate");
-
- ODTranslateResult result;
-
- SOM_TRY
-
- ODTypeList* typeList = somSelf->GetTranslationOf(ev, fromType);
-
- if (typeList->Count(ev) > 0)
- result = kODCanTranslate;
- else
- result = kODCannotTranslate;
-
- delete typeList;
-
- SOM_CATCH_ALL
- result = kODCannotTranslate;
- SOM_ENDTRY
-
- return result;
- }
-
- //------------------------------------------------------------------------------
- // ODTranslation: ShowPartTranslateDialog
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK ODTranslationShowPartTranslateDialog(ODTranslation *somSelf, Environment *ev,
- ODPartWrapper* partWrapper)
- {
- ODTranslationData *somThis = ODTranslationGetData(somSelf);
- ODTranslationMethodDebug("ODTranslation","ODTranslationShowPartTranslateDialog");
-
- SOM_TRY
-
- return _fTranslationDialog->ShowPartTranslateDialog(partWrapper);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODFalse;
- }
-
- //------------------------------------------------------------------------------
- // ODTranslation: ShowTranslateDialog
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK ODTranslationShowTranslateDialog(ODTranslation *somSelf, Environment *ev,
- ODTypeList* translateToList,
- ODUShort initialKind,
- ODUShort* selectedKind,
- ODEditor initialEditor,
- ODBoolean canChangeEditor,
- ODEditor* selectedEditor)
- {
- ODTranslationData *somThis = ODTranslationGetData(somSelf);
- ODTranslationMethodDebug("ODTranslation","ODTranslationShowTranslateDialog");
-
- ODBoolean result = kODFalse; ODVolatile(result);
- ODUShort kind = initialKind; ODVolatile(kind);
- ODEditor editor = kODNULL; ODVolatile(editor);
-
- *selectedKind = initialKind;
- *selectedEditor = kODNULL;
-
- SOM_TRY
-
- // Convert from initial kind and editor
- if ( initialEditor != kODNULL )
- editor = ODISOStrFromCStr((char *) initialEditor);
-
- result = _fTranslationDialog->ShowTranslateDialog(
- translateToList,
- &kind,
- &editor,
- canChangeEditor,
- kODTrue);
-
- // Convert to selected kind and editor
- if ( result )
- {
- *selectedKind = kind;
- *selectedEditor = editor;
- editor = kODNULL;
- }
-
- SOM_CATCH_ALL
-
- SOM_ENDTRY
-
- ODDisposePtr((ODPtr) editor);
-
- return result;
- }
-
- //------------------------------------------------------------------------------
- // ODTranslation: GetTranslationOf
- //------------------------------------------------------------------------------
- // Return the set of kinds the argument may be translated into. Internally, this
- // routine converts to and from platform types to use the translation services of
- // the host platform.
-
- SOM_Scope ODTypeList* SOMLINK ODTranslationGetTranslationOf(ODTranslation *somSelf, Environment *ev,
- ODValueType fromType)
- {
- ODTranslationData *somThis = ODTranslationGetData(somSelf);
- ODTranslationMethodDebug("ODTranslation","ODTranslationGetTranslationOf");
-
- SOM_TRY
-
- ODHandle destinationTypes;
-
- if (_fMEOExists == kODFalse)
- THROW(kODErrNoSysTranslationFacility);
-
- // Initialize the parameters for TranslateScrap
- // Set up ODTypeList as refCon
-
- TempODTypeList fromTypeList = _fSession->GetStorageSystem(ev)->CreateTypeList(ev, kODNULL);
- fromTypeList->AddLast(ev, fromType);
-
- TranslationRefCon refCon;
- refCon.InitTranslationRefCon(fromTypeList);
-
- destinationTypes = ODNewHandle(0);
-
- // This TranslateScrap is only a query
-
-
- OSErr err = noErr;
-
- //#ifdef __MWERKS__
- // The following call is ifdef out because we don't have a 68K
- // CFM library for Translation Manager yet.
-
- TranslateScrap((GetScrapDataUPP) &gGetScrapDataProcRD,
- &refCon,
- kFormatListFormat,
- (Handle) destinationTypes,
- kTranslationScrapProgressDialogID);
-
- //#endif
-
- THROW_IF_ERROR(err);
-
- // Put destinationTypes into a ODTypeList
-
- ODULong numDestTypes = ODGetHandleSize(destinationTypes) / sizeof(FormatAvailable);
- #ifdef ODDebug_Translation
- somPrintf("GetTranslationOf: numDestTypes %d\n", numDestTypes);
- #endif
- FormatAvailable* osTypes = (FormatAvailable*) ODLockHandle(destinationTypes);
- ODTypeList* toTypeList = _fSession->GetStorageSystem(ev)->CreateTypeList(ev, kODNULL);
-
- OSType fromOSType = LocalGetPlatformTypeFromISOType(fromType);
-
- for (ODULong i = 0; i < numDestTypes; i++) {
- if (osTypes[i].theType != fromOSType) {
- TempODType isoType = // DMc: make temp to ensure deletion
- somSelf->GetISOTypeFromPlatformType(ev, osTypes[i].theType, kODPlatformDataType);
- toTypeList->AddLast(ev, isoType);
- }
- }
-
- ODUnlockHandle(destinationTypes);
- ODDisposeHandle(destinationTypes);
-
- // Return the created ODTypeList
-
- return toTypeList;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // ODTranslation: TranslateView
- //------------------------------------------------------------------------------
-
- SOM_Scope ODTranslateResult SOMLINK ODTranslationTranslateView(ODTranslation *somSelf, Environment *ev,
- ODStorageUnitView* fromView,
- ODStorageUnitView* toView)
- {
- ODTranslationData *somThis = ODTranslationGetData(somSelf);
- ODTranslationMethodDebug("ODTranslation","ODTranslationTranslateView");
-
- ODTranslateResult result = kODCannotTranslate;
-
- SOM_TRY
-
- if (_fMEOExists == kODFalse)
- THROW(kODErrNoSysTranslationFacility);
-
- ODHandle toDataHandle = kODNULL;
-
- // Get the source data
- TempODValueType fromType = fromView->GetType(ev); // DMc: ensure it's deleted
-
- ODULong size = fromView->GetSize(ev);
- ODByteArray fromDataBA;
- fromView->GetValue(ev, size, &fromDataBA);
-
- // Get the to type
- TempODValueType toType = toView->GetType(ev); // DMc: ensure it's deleted
-
- // Do the translation
- if (CommonTranslate(somSelf, ev, fromType, &fromDataBA, toType, &toDataHandle) == noErr) {
-
- // Create the toData
- ODPtr toData = ODLockHandle(toDataHandle);
-
- // Set the value in the toView
- StorageUnitViewSetValue(toView, ev, ODGetHandleSize(toDataHandle), toData);
-
- // Get rid of toData Byte Array and Handle
-
- ODUnlockHandle(toDataHandle);
- ODDisposeHandle(toDataHandle);
-
- // Set up result
- result = kODCanTranslate;
- }
-
- ODDisposePtr(fromDataBA._buffer);
-
- SOM_CATCH_ALL
- result = kODCannotTranslate;
- SOM_ENDTRY
-
- return result;
- }
-
- //------------------------------------------------------------------------------
- // ODTranslation: Translate
- //------------------------------------------------------------------------------
-
- SOM_Scope ODTranslateResult SOMLINK ODTranslationTranslate(ODTranslation *somSelf, Environment *ev,
- ODValueType fromType,
- ODByteArray* fromDataBA,
- ODValueType toType,
- ODByteArray* toDataBA)
- {
- ODTranslationData *somThis = ODTranslationGetData(somSelf);
- ODTranslationMethodDebug("ODTranslation","ODTranslationTranslate");
-
- ODTranslateResult result = kODCannotTranslate;
- ODHandle toDataHandle = kODNULL;
-
- SOM_TRY
-
- // Check for MEO
-
- if (_fMEOExists == kODFalse)
- THROW(kODErrNoSysTranslationFacility);
-
- ASSERT(fromDataBA != kODNULL, kODErrIllegalNullInput);
- ASSERT(toDataBA != kODNULL, kODErrIllegalNullInput);
-
- // Translate
-
- if (CommonTranslate(somSelf, ev, fromType, fromDataBA, toType, &toDataHandle) == noErr) {
- ODULong toDataSize = ODGetHandleSize(toDataHandle);
- #ifdef ODDebug_Translation
- somPrintf("toDataHandle %x toDataSize %d\n", toDataHandle, toDataSize);
- #endif
- ODPtr toData = ODLockHandle(toDataHandle);
-
- *toDataBA = CreateByteArrayStruct(toData, toDataSize);
-
- // Get rid of handle
- ODUnlockHandle(toDataHandle);
- ODDisposeHandle(toDataHandle);
-
- // Set up return code
- result = kODCanTranslate;
- }
-
- SOM_CATCH_ALL
- result = kODCannotTranslate;
- SOM_ENDTRY
-
- return result;
- }
-
- //------------------------------------------------------------------------------
- // ODTranslation: GetISOTypeFromPlatformType
- //------------------------------------------------------------------------------
-
- SOM_Scope ODValueType SOMLINK ODTranslationGetISOTypeFromPlatformType(ODTranslation *somSelf, Environment *ev,
- ODPlatformType platformType,
- ODPlatformTypeSpace typeSpace)
- {
- ODTranslationData *somThis = ODTranslationGetData(somSelf);
- ODTranslationMethodDebug("ODTranslation","ODTranslationGetISOTypeFromPlatformType");
-
- ODValueType type = kODNULL; ODVolatile(type);
-
- SOM_TRY
-
- type = LocalGetISOTypeFromPlatformType(platformType, typeSpace);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
-
- return type;
- }
-
- //------------------------------------------------------------------------------
- // ODTranslation: GetPlatformTypeFromISOType
- //------------------------------------------------------------------------------
-
- SOM_Scope ODPlatformType SOMLINK ODTranslationGetPlatformTypeFromISOType(ODTranslation *somSelf, Environment *ev,
- ODValueType type)
- {
- ODTranslationData *somThis = ODTranslationGetData(somSelf);
- ODTranslationMethodDebug("ODTranslation","ODTranslationGetPlatformTypeFromISOType");
-
- SOM_TRY
- return LocalGetPlatformTypeFromISOType(type);
- SOM_CATCH_ALL
- SOM_ENDTRY
-
- return ' '; // This is just used to pacify the compiler. This return result
- // should never be used by the caller.
- }
-
- //=====================================================================================
- // CommonTranslate
- //=====================================================================================
-
- OSErr CommonTranslate(ODTranslation* translation,
- Environment* ev,
- ODValueType fromType,
- ODByteArray* fromDataBA,
- ODValueType toType,
- ODHandle* destHandle)
- {
- // Set up params for Translation
-
- *destHandle = kODNULL;
- TranslationRefCon refCon;
-
- TempODTypeList fromTypeList =
- ODTranslationGetData(translation)->fSession->GetStorageSystem(ev)->CreateTypeList(ev, kODNULL);
- fromTypeList->AddLast(ev, fromType);
-
- refCon.InitTranslationRefCon(fromTypeList,
- fromDataBA->_buffer,
- translation->GetPlatformTypeFromISOType(ev, fromType),
- (ODULong) fromDataBA->_length);
-
- OSType destType = translation->GetPlatformTypeFromISOType(ev, toType);
-
- // Do the translation
-
- //#ifdef __MWERKS__
- *destHandle = ODNewHandle(0);
- OSErr err = TranslateScrap((GetScrapDataUPP) &gGetScrapDataProcRD,
- &refCon,
- destType,
- (Handle) *destHandle,
- kTranslationScrapProgressDialogID);
- if (err != noErr) {
- ODDisposeHandle(*destHandle);
- *destHandle = kODNULL;
- }
-
- return err;
-
- //#else
-
- // return noErr;
-
- //#endif
-
- }
-
- //=====================================================================================
- // LocalGetISOTypeFromPlatformType
- //=====================================================================================
-
- ODType LocalGetISOTypeFromPlatformType(ODPlatformType platformType,
- ODPlatformTypeSpace typeSpace)
- {
- ODType isoType = kODNULL;
- ODULong prefixSize;
-
- switch (typeSpace)
- {
- case kODPlatformDataType:
-
- prefixSize = ODISOStrLength(kODAppleScrapTypePrefix);
- isoType = (ODValueType) ODNewPtr(prefixSize + sizeof(ODPlatformType) + 1,
- ODGetDefaultHeap());
- if (isoType != kODNULL) {
- ODISOStrCopy(isoType, kODAppleScrapTypePrefix);
- ODISOStrNConcat(isoType, (ODISOStr) &platformType, sizeof(ODPlatformType));
- isoType[prefixSize + sizeof(ODPlatformType)] = 0;
- }
- break;
-
- case kODPlatformFileType:
- prefixSize = ODISOStrLength(kODAppleFileTypePrefix);
- isoType = (ODValueType) ODNewPtr(prefixSize + sizeof(ODPlatformType) + 1,
- ODGetDefaultHeap());
- if (isoType != kODNULL) {
- ODISOStrCopy(isoType, kODAppleFileTypePrefix);
- ODISOStrNConcat(isoType, (ODISOStr) &platformType, sizeof(ODPlatformType));
- isoType[prefixSize + sizeof(ODPlatformType)] = 0;
- }
- break;
-
- default:
- break;
- }
-
- return isoType;
- }
-
- //=====================================================================================
- // LocalGetPlatformTypeFromISOType
- //=====================================================================================
-
- ODPlatformType LocalGetPlatformTypeFromISOType(ODType type)
- {
-
- ODPlatformType platformType = (ODPlatformType) 0L;
- ODULong prefixSize;
-
- prefixSize = ODISOStrLength(kODAppleScrapTypePrefix);
- if (ODISOStrNCompare(kODAppleScrapTypePrefix, (ODISOStr) type, prefixSize))
- {
- prefixSize = ODISOStrLength(kODAppleFileTypePrefix);
- if (ODISOStrNCompare(kODAppleFileTypePrefix, (ODISOStr) type, prefixSize))
- {
- prefixSize = 0;
- platformType = kODNULL;
- }
- }
- if (prefixSize > 0)
- {
- ODISOStrNCopy((ODISOStr) &platformType,
- (ODISOStr) ((ODSByte*) type + prefixSize),
- sizeof(ODPlatformType));
- }
- return platformType;
- }
-
- //=====================================================================================
- // GetScrapDataProc
- //=====================================================================================
- pascal OSErr GetScrapDataProc(ScrapType requestedFormat,
- Handle data,
- void* srcDataGetterRefCon)
- {
- #ifdef ODDebug_Translation
- somPrintf("Entering GetScrapDataProc.\n");
- #endif
-
- Environment* ev = somGetGlobalEnvironment();
-
- ODHandle dataHandle = (ODHandle) data;
-
- // Get the refCon and return the data for the requested type
- TranslationRefCon* refCon = (TranslationRefCon*) srcDataGetterRefCon;
-
- if (requestedFormat == kFormatListFormat) {
- ODTypeList* typeList = refCon->fTypeList;
- ODULong numOfTypes = typeList->Count(ev);
-
- #ifdef ODDebug_Translation
- somPrintf("numOfTypes: %d\n", numOfTypes);
- #endif
-
- ODSetHandleSize(dataHandle, numOfTypes * sizeof(FormatAvailable));
-
- FormatAvailable* dataPtr = (FormatAvailable*) ODLockHandle(dataHandle);
- ODTypeListIterator* iter = typeList->CreateTypeListIterator(ev);
- ODType isoType = iter->First(ev);
- for (ODULong i = 0; i < numOfTypes; i++) {
- OSType osType = LocalGetPlatformTypeFromISOType(isoType);
- #ifdef ODDebug_Translation
- somPrintf("OSType %x ISOType %s\n", osType, isoType);
- #endif
- ODBlockMove(&osType, &(dataPtr[i].theType), sizeof(OSType));
- dataPtr[i].theLength = 0;
- ODDisposePtr(isoType);
- isoType = iter->Next(ev);
- }
- ODDeleteObject(iter);
- ODUnlockHandle(dataHandle);
-
- #ifdef ODDebug_Translation
- ODULong hSize = GetHandleSize((Handle) dataHandle);
- ODULong j;
- ODPtr hDataPtr = ODLockHandle(dataHandle);
- somPrintf("DataHandle: ");
- for (j = 0; j < hSize; j++)
- somPrintf("%x ", ((char*) hDataPtr)[j]);
- somPrintf("\n");
- ODUnlockHandle(dataHandle);
- #endif
- }
- else {
- #ifdef ODDebug_Translation
- somPrintf("%x %s %d\n", refCon->fDataType, refCon->fDataPtr, refCon->fDataSize);
- #endif
- ODSetHandleSize(dataHandle, refCon->fDataSize);
- ODPtr dataPtr = ODLockHandle(dataHandle);
- ODBlockMove(refCon->fDataPtr, dataPtr, refCon->fDataSize);
- ODUnlockHandle(dataHandle);
- }
-
- #ifdef ODDebug_Translation
- somPrintf("Exiting GetScrapDataProc.\n");
- #endif
- return noErr;
- }
-
-